home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / AMIGA / timer.c < prev   
C/C++ Source or Header  |  1979-12-31  |  3KB  |  168 lines

  1. /* --------------------------------- timer.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* High resolution timer services.
  8.  * Amiga version by Michael Taylor.
  9. */
  10.  
  11. #include "fly.h"
  12. #include "amigainc.h"
  13.  
  14. #include <sys/types.h>
  15. #include <sys/timeb.h>
  16. #include <time.h>
  17.  
  18. static struct timerequest tr;
  19. static struct MsgPort *tport=NULL;
  20. /*static struct Message *msg;*/
  21.  
  22. static Ulong    seconds = 0, ticks = 0;
  23.  
  24. #define XTAL    1000000L        /* ticks resolution */
  25.  
  26. static void NEAR
  27. timer_get (void)
  28. {
  29. #if 1
  30. /* Issue the command and wait for it to finish, then get the reply
  31. */
  32.     DoIO((struct IORequest *) &tr);
  33.  
  34. /* Get the results and close the timer device
  35. */
  36.     ticks = tr.tr_time.tv_micro;
  37.     seconds = tr.tr_time.tv_secs;
  38. #else
  39.     CurrentTime (&seconds, &ticks);
  40. #endif
  41. }
  42.  
  43. static Ulong FAR
  44. timer_milli (void)
  45. {
  46.     timer_get ();
  47.     return (ticks / 1000 + seconds * 1000);
  48. }
  49.  
  50. static int FAR
  51. timer_hires (void)        /* get fastest timer available */
  52. {return (1);}
  53.  
  54. static int FAR
  55. timer_init (void)
  56. {
  57.    LONG error;
  58.    Ulong days,hrs,secs,mins,mics;
  59.  
  60.    /* Open the MICROHZ timer device */
  61.    error = OpenDevice(TIMERNAME,UNIT_MICROHZ,(struct IORequest *) &tr,0);
  62.    if(error) return 1;/* If the timer will not open then just return */
  63.  
  64.    tport=(struct MsgPort *)CreatePort(0,0);
  65.    /* If we can't get a reply port then just quit */
  66.    if(!tport)
  67.         {
  68.         CloseDevice((struct IORequest *) &tr );
  69.         return 1;
  70.         }
  71.  
  72.    /* Fill in the IO block with command data */
  73.    tr.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
  74.    tr.tr_node.io_Message.mn_Node.ln_Pri  = 0;
  75.    tr.tr_node.io_Message.mn_Node.ln_Name = NULL;
  76.    tr.tr_node.io_Message.mn_ReplyPort    = tport;
  77.    tr.tr_node.io_Flags             = IOF_QUICK;
  78.    tr.tr_node.io_Command                 = TR_GETSYSTIME;
  79.  
  80.    return (0);
  81. }
  82.  
  83. static void FAR
  84. timer_term (void)
  85. {
  86.     if (tport) {
  87.         DeletePort(tport);
  88.         CloseDevice((struct IORequest *) &tr);
  89.     }
  90. }
  91.  
  92. static char * FAR
  93. timer_ctime (void)
  94. {
  95.     struct timeb    tm;
  96.  
  97.     ftime (&tm);
  98.     return (ctime (&tm.time));
  99. }
  100.  
  101. #define NINTS        10
  102.  
  103. static Ulong FAR
  104. timer_interval (int mode, Ulong res)
  105. {
  106.     static Ulong    last_seconds[NINTS], last_ticks[NINTS];
  107.     static int    n = -1;
  108.     Ulong        t = 0;
  109.  
  110.     if (mode & TMR_PUSH) {
  111.         ++n;
  112.         if (n >= NINTS) {
  113.             LogPrintf ("timer: too many PUSHes... aborting\n");
  114.             die ();
  115.         }
  116.     } else if (n < 0) {
  117.         LogPrintf ("timer: too many POPs... aborting\n");
  118.         die ();
  119.     }
  120.  
  121.     if (mode & (TMR_READ|TMR_SET))
  122.         timer_get ();
  123.  
  124.     if (mode & TMR_READ) {
  125.         if (res > XTAL)
  126.             res = 0;
  127.         if (res > 0x7fffffffL/XTAL) {
  128.             Ulong    tt;
  129.  
  130.             tt = res/(0x7fffffffL/XTAL) + 1;
  131.             t = (seconds-last_seconds[n]) * res;
  132.             if (ticks > last_ticks[n])
  133.                 t += ((ticks-last_ticks[n]) * (res/tt))
  134.                     / (XTAL/tt);
  135.             else
  136.                 t -= ((last_ticks[n]-ticks) * (res/tt))
  137.                     / (XTAL/tt);
  138.         } else if (res)
  139.             t = (seconds-last_seconds[n]) * res
  140.                 + (long)((ticks-last_ticks[n]) * res) / XTAL;
  141.         else
  142.             t = (seconds-last_seconds[n]) * XTAL
  143.                 + (long)(ticks-last_ticks[n]);
  144.     }
  145.  
  146.     if (mode & TMR_SET) {
  147.         last_seconds[n] = seconds;
  148.         last_ticks[n]   = ticks;
  149.     }
  150.  
  151.     if (mode & TMR_POP)
  152.         --n;
  153.     return (t);
  154. }
  155.  
  156. extern struct TmDriver TmDriver = {
  157.     "timer.device",
  158.     0,
  159.     timer_init,
  160.     timer_term,
  161.     timer_milli,
  162.     timer_hires,
  163.     timer_ctime,
  164.     timer_interval
  165. };
  166.  
  167. #undef XTAL
  168.